Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Algorithmus von Cohen-Sutherland</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Algorithmus_von_Cohen-Sutherland"> <link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Algorithmus_von_Cohen-Sutherland rootpage-Algorithmus_von_Cohen-Sutherland skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Algorithmus von Cohen-Sutherland</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><p>Der <b>Algorithmus von Cohen-Sutherland</b> ist ein <a href="Algorithmus" title="Algorithmus">Algorithmus</a> zum Abschneiden (<a href="Clipping_(Computergrafik)" title="Clipping (Computergrafik)">Clipping</a>) von Linien an einem <a href="Rechteck" title="Rechteck">Rechteck</a>. Er ist nach seinen Erfindern <a href="Danny_Cohen_(Ingenieur)" title="Danny Cohen (Ingenieur)">Danny Cohen</a> und <a href="Ivan_Sutherland" title="Ivan Sutherland">Ivan Sutherland</a> benannt. Der Algorithmus gilt als populärster, wenn auch nicht effizientester für seine Zwecke. Er eignet sich besonders für Fälle, in denen ein hoher Anteil der zu clippenden Linien inner- oder außerhalb des Rechtecks liegt.
</p>
<div class="mw-heading mw-heading2"><h2 id="Schritte">Schritte</h2></div>
<p>Zuerst werden jeweils für die beiden Endpunkte der zu zeichnenden Linie vier <a href="Flag_(Informatik)" title="Flag (Informatik)">Flags</a> ermittelt, die gesetzt werden, wenn sich der Endpunkt links des Rechtecks, rechts davon, darunter oder darüber befindet. Ist keines der Flags gesetzt, dann liegen beide Endpunkte innerhalb des Rechtecks, es ist kein Clipping notwendig und die Linie kann einfach gezeichnet werden.
</p>

<p>Wenn dieser triviale Fall nicht eintritt, werden im nächsten Schritt die einander entsprechenden Flags beider Endpunkte angesehen. Ist mindestens eines dieser Flags bei beiden Endpunkten gesetzt, so befindet sich die gesamte Linie außerhalb des Rechtecks und die Linie braucht nicht gezeichnet zu werden.
</p><p>Wenn auch dieser einfache Fall nicht auftritt, wird der Schnittpunkt einer (beliebigen) Rechteck-Seite mit dem Liniensegment berechnet und der überlappende Teil erneut getestet (und eventuell gekürzt), bis schließlich beide Punkte innerhalb des Rechtecks liegen.
</p>
<div class="mw-heading mw-heading2"><h2 id="Implementierung">Implementierung</h2></div>
<p>Das folgende Programm gibt ein Beispiel einer <a href="Implementierung" title="Implementierung">Implementierung</a> des Cohen-Sutherland-Algorithmus in C++, anhand dessen man die Funktionsweise gut nachvollziehen kann.
</p>
<div class="mw-highlight mw-highlight-lang-cpp mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="cm">/*----------------------------------------------------------------------------------------</span>
<span class="cm"> Clipping der zwei X,Y Koordinaten einer Linie innerhalb eines zweidimensionalen</span>
<span class="cm"> Clipping Rechtecks XMin,YMin,XMax,YMax nach Cohen Sutherland.</span>

<span class="cm"> Nach Ablauf der Funktion sind die Koordinaten der beiden Punkte so geclippt, dass sie</span>
<span class="cm"> innerhalb des Clipping Rechtecks liegen und der Linie entsprechen, die übrig bleibt,</span>
<span class="cm"> wenn man die außerhalb liegenden Teile abschneidet.</span>

<span class="cm"> Falls kein Teil der Linie das Clipping Rechteck überstreicht, liefert die Funktion den</span>
<span class="cm"> Wert FALSE zurück.</span>

<span class="cm"> x1,y1 &nbsp;: Koordinate des Anfangspunktes der Linie</span>
<span class="cm"> x2,y2 &nbsp;: Koordinate des Endpunktes der Linie</span>
<span class="cm"> return &nbsp;: FALSE Linie ist komplett geclippt und braucht nicht gezeichnet zu werden.</span>
<span class="cm"> TRUE Die Koordinaten sind geclippt und die Linie kann jetzt gezeichnet werden</span>
<span class="cm"> ------------------------------------------------------------------------------------------*/</span>

<span class="w"> </span><span class="cp">#define CLIPLEFT 1 </span><span class="c1">// Binär 0001</span>
<span class="w"> </span><span class="cp">#define CLIPRIGHT 2 </span><span class="c1">// 0010</span>
<span class="w"> </span><span class="cp">#define CLIPLOWER 4 </span><span class="c1">// 0100</span>
<span class="w"> </span><span class="cp">#define CLIPUPPER 8 </span><span class="c1">// 1000</span>

<span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="nf">clipline</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="o">&amp;</span><span class="n">x1</span><span class="p">,</span><span class="kt">int</span><span class="w"> </span><span class="o">&amp;</span><span class="n">y1</span><span class="p">,</span><span class="kt">int</span><span class="w"> </span><span class="o">&amp;</span><span class="n">x2</span><span class="p">,</span><span class="kt">int</span><span class="w"> </span><span class="o">&amp;</span><span class="n">y2</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">K1</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span><span class="n">K2</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="c1">// Variablen mit je 4 Flags für rechts, links, oben, unten.</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">dx</span><span class="p">,</span><span class="n">dy</span><span class="p">;</span>

<span class="w"> </span><span class="n">dx</span><span class="o">=</span><span class="n">x2</span><span class="o">-</span><span class="n">x1</span><span class="p">;</span><span class="w"> </span><span class="c1">// Die Breite der Linie vorberechnen für spätere Koordinaten Interpolation</span>
<span class="w"> </span><span class="n">dy</span><span class="o">=</span><span class="n">y2</span><span class="o">-</span><span class="n">y1</span><span class="p">;</span><span class="w"> </span><span class="c1">// Die Höhe der Linie vorberechnen für spätere Koordinaten Interpolation</span>

<span class="w"> </span><span class="c1">// Die folgende Abfrage setzt die Flags CLIPLEFT,CLIPRIGHT,CLIPUPPER,CLIPLOWER, falls die Koordinate</span>
<span class="w"> </span><span class="c1">// auf einer oder zwei Seiten außerhalb des Clip Rechtecks liegt. Ein Punkt kann nicht gleichzeitig</span>
<span class="w"> </span><span class="c1">// rechts und links (bzw. oben und unten) außerhalb liegen, daher können nur maximal 2 Flags gesetzt sein.</span>
<span class="w"> </span><span class="c1">// Es gibt 9 Möglichkeiten. Davon sind 8 ungleich 0 und zeigen an, dass die Koordinate geclippt werden muss.</span>

<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">y1</span><span class="o">&lt;</span><span class="n">YMin</span><span class="p">)</span><span class="w"> </span><span class="n">K1</span><span class="w"> </span><span class="o">=</span><span class="n">CLIPLOWER</span><span class="p">;</span><span class="w"> </span><span class="c1">// Ermittle, wo der Anfangspunkt außerhalb des Clip Rechtecks liegt.</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">y1</span><span class="o">&gt;</span><span class="n">YMax</span><span class="p">)</span><span class="w"> </span><span class="n">K1</span><span class="w"> </span><span class="o">=</span><span class="n">CLIPUPPER</span><span class="p">;</span><span class="w"> </span><span class="c1">// Es werden entweder CLIPLOWER oder CLIPUPPER und/oder CLIPLEFT oder CLIPRIGHT gesetzt</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">x1</span><span class="o">&lt;</span><span class="n">XMin</span><span class="p">)</span><span class="w"> </span><span class="n">K1</span><span class="o">|=</span><span class="n">CLIPLEFT</span><span class="p">;</span><span class="w"> </span><span class="c1">// Es gibt 8 zu clippende Kombinationen, je nachdem in welchem der 8 angrenzenden</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">x1</span><span class="o">&gt;</span><span class="n">XMax</span><span class="p">)</span><span class="w"> </span><span class="n">K1</span><span class="o">|=</span><span class="n">CLIPRIGHT</span><span class="p">;</span><span class="w"> </span><span class="c1">// Bereiche des Clip Rechtecks die Koordinate liegt.</span>

<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">y2</span><span class="o">&lt;</span><span class="n">YMin</span><span class="p">)</span><span class="w"> </span><span class="n">K2</span><span class="w"> </span><span class="o">=</span><span class="n">CLIPLOWER</span><span class="p">;</span><span class="w"> </span><span class="c1">// Ermittle, wo der Endpunkt außerhalb des Clip Rechtecks liegt.</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">y2</span><span class="o">&gt;</span><span class="n">YMax</span><span class="p">)</span><span class="w"> </span><span class="n">K2</span><span class="w"> </span><span class="o">=</span><span class="n">CLIPUPPER</span><span class="p">;</span><span class="w"> </span><span class="c1">// Wenn keines der Flags gesetzt ist, dann liegt die Koordinate</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">x2</span><span class="o">&lt;</span><span class="n">XMin</span><span class="p">)</span><span class="w"> </span><span class="n">K2</span><span class="o">|=</span><span class="n">CLIPLEFT</span><span class="p">;</span><span class="w"> </span><span class="c1">// innerhalb des Rechtecks und muss nicht geändert werden.</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">x2</span><span class="o">&gt;</span><span class="n">XMax</span><span class="p">)</span><span class="w"> </span><span class="n">K2</span><span class="o">|=</span><span class="n">CLIPRIGHT</span><span class="p">;</span>

<span class="w"> </span><span class="c1">// Schleife nach Cohen Sutherland, die maximal zweimal durchlaufen wird</span>

<span class="w"> </span><span class="k">while</span><span class="p">(</span><span class="n">K1</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">K2</span><span class="p">)</span><span class="w"> </span><span class="c1">// muss wenigstens eine der Koordinaten irgendwo geclippt werden?</span>
<span class="w"> </span><span class="p">{</span>

<span class="w"> </span><span class="c1">// wenn beide Koordinaten entweder links, rechts, über oder unter dem Clipping Rechteck liegen</span>
<span class="w"> </span><span class="c1">// ist kein Teil der Linie sichtbar, daher ist keine weitere Berechnung notwendig.</span>
<span class="w"> </span><span class="c1">// Die geclippte Linie ist unsichtbar.</span>

<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">K1</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">K2</span><span class="p">)</span><span class="w"> </span><span class="c1">// logisches AND der beiden Koordinaten Flags ungleich 0?</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">FALSE</span><span class="p">;</span><span class="w"> </span><span class="c1">// beide Punkte liegen jeweils auf der gleichen Seite außerhalb des Rechtecks</span>

<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">K1</span><span class="p">)</span><span class="w"> </span><span class="c1">// schnelle Abfrage, muss Koordinate 1 geclippt werden?</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">K1</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">CLIPLEFT</span><span class="p">)</span><span class="w"> </span><span class="c1">// ist Anfangspunkt links außerhalb?</span>
<span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// ja</span>
<span class="w"> </span><span class="n">y1</span><span class="o">+=</span><span class="p">(</span><span class="n">XMin</span><span class="o">-</span><span class="n">x1</span><span class="p">)</span><span class="o">*</span><span class="n">dy</span><span class="o">/</span><span class="n">dx</span><span class="p">;</span><span class="w"> </span><span class="c1">// berechne y1 durch lineare Interpolation, dx kann hier nie 0 sein</span>
<span class="w"> </span><span class="n">x1</span><span class="o">=</span><span class="n">XMin</span><span class="p">;</span><span class="w"> </span><span class="c1">// setze x1 an den linken Rand des Clip Rechtecks</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">K1</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">CLIPRIGHT</span><span class="p">)</span><span class="w"> </span><span class="c1">// ist Anfangspunkt rechts außerhalb?</span>
<span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// ja</span>
<span class="w"> </span><span class="n">y1</span><span class="o">+=</span><span class="p">(</span><span class="n">XMax</span><span class="o">-</span><span class="n">x1</span><span class="p">)</span><span class="o">*</span><span class="n">dy</span><span class="o">/</span><span class="n">dx</span><span class="p">;</span><span class="w"> </span><span class="c1">// berechne y1 durch lineare Interpolation, dx kann hier nie 0 sein</span>
<span class="w"> </span><span class="n">x1</span><span class="o">=</span><span class="n">XMax</span><span class="p">;</span><span class="w"> </span><span class="c1">// setze x1 an den rechten Rand des Clip Rechtecks</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">K1</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">CLIPLOWER</span><span class="p">)</span><span class="w"> </span><span class="c1">// ist Anfangspunkt unterhalb des Rechtecks?</span>
<span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// ja</span>
<span class="w"> </span><span class="n">x1</span><span class="o">+=</span><span class="p">(</span><span class="n">YMin</span><span class="o">-</span><span class="n">y1</span><span class="p">)</span><span class="o">*</span><span class="n">dx</span><span class="o">/</span><span class="n">dy</span><span class="p">;</span><span class="w"> </span><span class="c1">// berechne x1 durch lineare Interpolation, dy kann hier nie 0 sein</span>
<span class="w"> </span><span class="n">y1</span><span class="o">=</span><span class="n">YMin</span><span class="p">;</span><span class="w"> </span><span class="c1">// setze y1 an den unteren Rand des Clip Rechtecks</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">K1</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">CLIPUPPER</span><span class="p">)</span><span class="w"> </span><span class="c1">// ist Anfangspunkt oberhalb des Rechtecks?</span>
<span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// ja</span>
<span class="w"> </span><span class="n">x1</span><span class="o">+=</span><span class="p">(</span><span class="n">YMax</span><span class="o">-</span><span class="n">y1</span><span class="p">)</span><span class="o">*</span><span class="n">dx</span><span class="o">/</span><span class="n">dy</span><span class="p">;</span><span class="w"> </span><span class="c1">// berechne x1 durch lineare Interpolation, dy kann hier nie 0 sein</span>
<span class="w"> </span><span class="n">y1</span><span class="o">=</span><span class="n">YMax</span><span class="p">;</span><span class="w"> </span><span class="c1">// setze y1 an den oberen Rand des Clip Rechtecks</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">K1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="c1">// Erst davon ausgehen, dass der Punkt jetzt innerhalb liegt,</span>
<span class="w"> </span><span class="c1">// falls das nicht zutrifft, wird gleich korrigiert.</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">y1</span><span class="o">&lt;</span><span class="n">YMin</span><span class="p">)</span><span class="w"> </span><span class="n">K1</span><span class="w"> </span><span class="o">=</span><span class="n">CLIPLOWER</span><span class="p">;</span><span class="w"> </span><span class="c1">// ermittle erneut, wo der Anfangspunkt jetzt außerhalb des Clip Rechtecks liegt</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">y1</span><span class="o">&gt;</span><span class="n">YMax</span><span class="p">)</span><span class="w"> </span><span class="n">K1</span><span class="w"> </span><span class="o">=</span><span class="n">CLIPUPPER</span><span class="p">;</span><span class="w"> </span><span class="c1">// Für einen Punkt, bei dem im ersten Durchlauf z. B. CLIPLEFT gesetzt war,</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">x1</span><span class="o">&lt;</span><span class="n">XMin</span><span class="p">)</span><span class="w"> </span><span class="n">K1</span><span class="o">|=</span><span class="n">CLIPLEFT</span><span class="p">;</span><span class="w"> </span><span class="c1">// kann im zweiten Durchlauf z. B. CLIPLOWER gesetzt sein</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">x1</span><span class="o">&gt;</span><span class="n">XMax</span><span class="p">)</span><span class="w"> </span><span class="n">K1</span><span class="o">|=</span><span class="n">CLIPRIGHT</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>

<span class="w"> </span><span class="c1">// muss hier nochmal getestet werden, sonst werden Linien, die über Eck außerhalb liegen nicht korrekt behandelt</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">K1</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">K2</span><span class="p">)</span><span class="w"> </span><span class="c1">// logisches AND der beiden Koordinaten Flags ungleich 0?</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">FALSE</span><span class="p">;</span><span class="w"> </span><span class="c1">// beide Punkte liegen jeweils auf der gleichen Seite außerhalb des Rechtecks</span>

<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">K2</span><span class="p">)</span><span class="w"> </span><span class="c1">// schnelle Abfrage, muss Koordinate 2 geclippt werden?</span>
<span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// ja</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">K2</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">CLIPLEFT</span><span class="p">)</span><span class="w"> </span><span class="c1">// liegt die Koordinate links außerhalb des Rechtecks?</span>
<span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// ja</span>
<span class="w"> </span><span class="n">y2</span><span class="o">+=</span><span class="p">(</span><span class="n">XMin</span><span class="o">-</span><span class="n">x2</span><span class="p">)</span><span class="o">*</span><span class="n">dy</span><span class="o">/</span><span class="n">dx</span><span class="p">;</span><span class="w"> </span><span class="c1">// berechne y durch lineare Interpolation, dx kann hier nie 0 sein</span>
<span class="w"> </span><span class="n">x2</span><span class="o">=</span><span class="n">XMin</span><span class="p">;</span><span class="w"> </span><span class="c1">// setze die x Koordinate an den linken Rand</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">K2</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">CLIPRIGHT</span><span class="p">)</span><span class="w"> </span><span class="c1">// liegt die Koordinate rechts außerhalb des Rechtecks?</span>
<span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// ja</span>
<span class="w"> </span><span class="n">y2</span><span class="o">+=</span><span class="p">(</span><span class="n">XMax</span><span class="o">-</span><span class="n">x2</span><span class="p">)</span><span class="o">*</span><span class="n">dy</span><span class="o">/</span><span class="n">dx</span><span class="p">;</span><span class="w"> </span><span class="c1">// berechne y durch lineare Interpolation, dx kann hier nie 0 sein</span>
<span class="w"> </span><span class="n">x2</span><span class="o">=</span><span class="n">XMax</span><span class="p">;</span><span class="w"> </span><span class="c1">// setze die x Koordinate an den rechten Rand</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">K2</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">CLIPLOWER</span><span class="p">)</span><span class="w"> </span><span class="c1">// liegt der Endpunkt unten außerhalb des Rechtecks?</span>
<span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// ja</span>
<span class="w"> </span><span class="n">x2</span><span class="o">+=</span><span class="p">(</span><span class="n">YMin</span><span class="o">-</span><span class="n">y2</span><span class="p">)</span><span class="o">*</span><span class="n">dx</span><span class="o">/</span><span class="n">dy</span><span class="p">;</span><span class="w"> </span><span class="c1">// berechne x durch lineare Interpolation, dy kann hier nie 0 sein</span>
<span class="w"> </span><span class="n">y2</span><span class="o">=</span><span class="n">YMin</span><span class="p">;</span><span class="w"> </span><span class="c1">// setze die y Koordinate an den unteren Rand</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">K2</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">CLIPUPPER</span><span class="p">)</span><span class="w"> </span><span class="c1">// liegt der Endpunkt oben außerhalb des Rechtecks?</span>
<span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// ja</span>
<span class="w"> </span><span class="n">x2</span><span class="o">+=</span><span class="p">(</span><span class="n">YMax</span><span class="o">-</span><span class="n">y2</span><span class="p">)</span><span class="o">*</span><span class="n">dx</span><span class="o">/</span><span class="n">dy</span><span class="p">;</span><span class="w"> </span><span class="c1">// berechne x durch lineare Interpolation, dy kann hier nie 0 sein</span>
<span class="w"> </span><span class="n">y2</span><span class="o">=</span><span class="n">YMax</span><span class="p">;</span><span class="w"> </span><span class="c1">// setze die y Koordinate an den oberen Rand</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">K2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="c1">// Erst davon ausgehen, dass der Punkt jetzt innerhalb liegt,</span>
<span class="w"> </span><span class="c1">// falls das nicht zutrifft, wird gleich korrigiert.</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">y2</span><span class="o">&lt;</span><span class="n">YMin</span><span class="p">)</span><span class="w"> </span><span class="n">K2</span><span class="w"> </span><span class="o">=</span><span class="n">CLIPLOWER</span><span class="p">;</span><span class="w"> </span><span class="c1">// ermittle erneut, wo der Endpunkt jetzt außerhalb des Clip Rechtecks liegt</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">y2</span><span class="o">&gt;</span><span class="n">YMax</span><span class="p">)</span><span class="w"> </span><span class="n">K2</span><span class="w"> </span><span class="o">=</span><span class="n">CLIPUPPER</span><span class="p">;</span><span class="w"> </span><span class="c1">// Ein Punkt, der z. B. zuvor über dem Clip Rechteck lag, kann jetzt entweder</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">x2</span><span class="o">&lt;</span><span class="n">XMin</span><span class="p">)</span><span class="w"> </span><span class="n">K2</span><span class="o">|=</span><span class="n">CLIPLEFT</span><span class="p">;</span><span class="w"> </span><span class="c1">// rechts oder links davon liegen. Wenn er innerhalb liegt wird kein</span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">x2</span><span class="o">&gt;</span><span class="n">XMax</span><span class="p">)</span><span class="w"> </span><span class="n">K2</span><span class="o">|=</span><span class="n">CLIPRIGHT</span><span class="p">;</span><span class="w"> </span><span class="c1">// Flag gesetzt.</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// Ende der while Schleife, die Schleife wird maximal zweimal durchlaufen.</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">TRUE</span><span class="p">;</span><span class="w"> </span><span class="c1">// jetzt sind die Koordinaten geclippt und die gekürzte Linie kann gezeichnet werden</span>
<span class="w"> </span><span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<ul><li><a rel="nofollow" class="external text" href="https://www.cs.helsinki.fi/group/goa/viewing/leikkaus/lineClip.html">Beschreibung</a> (englisch)</li>
<li><a rel="nofollow" class="external text" href="https://pastehtml.com/view/awhhmf14g.html">JavaScript-Implementierung</a> (mit Quelltext)</li>
<li><a rel="nofollow" class="external text" href="https://min.nl/cs426/classes/clip.html">Java-Applet</a></li></ul></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2023-11-20" href="https://de.wikipedia.org/wiki/?title=Algorithmus_von_Cohen-Sutherland&amp;oldid=239314235">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>